package com.bat.conf;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.context.annotation.Configuration;

import java.util.Arrays;

/**
 * 默认是使用基于JDK的动态代理来实现AOP，spring.aop.proxy-target-class=false 或者不配置，
 * 表示使用JDK的动态代理，pring.aop.proxy-target-class=true表示使用cglib，
 * 如果配置了spring.aop.proxy-target-class=false，但是代理类没有实现接口，则依然使用cglib。
 * <p>
 * //@EnableAspectJAutoProxy(proxyTargetClass=true,exposeProxy=true) 不用配置这个
 * 也可以使用
 * <p>
 * //@EnableAspectJAutoProxy(proxyTargetClass=true,exposeProxy=true)这个注解，注解表示启用AOP，当然默认也是启用AOP的，
 * 因为springboot的自动装配机制，第一个参数表示是使用JDK的动态代理还是Cglib的代理，第二个参数表示可以使用AopContext这个类进行一些操作。
 * 注释之前所有的application.properties中的配置，在启动类上加上
 * //@EnableAspectJAutoProxy(proxyTargetClass=true,exposeProxy=true) 作者：二月_春风
 * 链接：https://www.jianshu.com/p/8cdd5895360d
 *
 * @Description:
 * @Author: zpf
 * @Date: 2020/1/15 下午3:39
 */
@Slf4j
@Aspect
@Configuration
public class ExeTimeAspect {
    @Around(value = "(execution(* com.bat.domain.service..*.*(..)))")
    public Object service(ProceedingJoinPoint joinPoint) {
        String method =
            joinPoint.getTarget().getClass().getSimpleName() + "." + joinPoint.getSignature().getName() + "(..)";
        // 调用接口方法
        Object response = null;
        try {
            log.info("Service start. method : {} , Param : {}", method, Arrays.toString(joinPoint.getArgs()));
            response = joinPoint.proceed();
            log.info("Service finish. method : {}, Result : {}", method, response);
        } catch (Throwable e) {
            log.error("Service error. method : {} , Cause : {}", method, e);
        } finally {
            log.trace(System.currentTimeMillis() + "");
            //todo  清理ThreadContext.serialDestroy();
        }
        return response;
    }

}
